/**
 * pages对象
 * 独立配置加权页面
 * @param {String} desc 拦截提醒;
 */
var pages = {
	group1: {
		desc: '需要token才能访问',
		redirect: 'redirect',
		pages: [
			'/view/demo.html'
		]
	}
}

/**
 * condition 条件库
 * @author Dioxide.CN 2022/1/31
 */
class Condition {

	/**
	 * 检验token是否有效
	 * @return {Boolean} true: 有效; false: 不存在或无效;
	 */
	trueToken() {
		if(this.tokenStatue){
			var	ret = true
			$.ajax({
				async: false,
				url: 'http://localhost/verifyToken',
				type: 'post',
				data: {
					'token': $.cookie('token')
				},
				success: function(res) {
					ret = res
				}
			})
			return ret
		} else {
			return false
		}
	}

	/**
	 * @java public boolean ifToken(){}
	 * @retun {Boolean} true: 在页面内; false: 不在页面内;
	 */
	ifPage(pages) {
		var curr = window.location.pathname
		for(var key in pages) {
			if(curr.indexOf(pages[key])==0) {
				return true
			}
		}
		return false
	}

}

/**
 * util 工具库
 * @author Dioxide.CN 2022/1/31
 */
class Util extends Condition {

	/**
	 * 是否存在token
	 * @return {Boolean} true: 存在; false: 不存在;
	 */
	ifToken() {
		if($.cookie('token') == undefined) {
			this.tokenStatue = false
		} else {
			this.tokenStatue = true
		}
		return this
	}

	/**
	 * 重定向方法
	 * @param {String} page 目标页面名
	 */
	redirectTo(page) {
		window.open('/' + page + '.html','_self');
	}

	/**
	 * 条件集
	 * @param {Array} 条件返回组; 布尔二维数组
	 * @return {Boolean} true: 条件集为真; false: 条件集为假;
	 */
	getBoolean(...bool) {
		var last = true
		for(var key of bool[0]) {
			last = last && key
		}
		return last
	}

	/**
	 * 在页面内且条件集为真时才能访问
	 * @java public void intercept(){}
	 * @param {Object} target 配置组
	 * @param {Array} condition 条件集
	 */
	intercept(target, ...condition) {
		if(this.ifPage(target.pages)) {
			if(!this.getBoolean(condition)) {
				this.redirectTo(target.redirect)
			}
		}
	}

}

const util = new Util() //实例化util

/**
 * 拦截区
 * @example util.intercept(配置组, 条件集)
 * @example util.intercept(pages.group1,util.ifToken().trueToken())
*/
util.intercept(pages.group1,util.ifToken().trueToken())

